package com.ceres.system.service.impl;

import com.ceres.system.dao.RoleMapper;
import com.ceres.system.pojo.Role;
import com.ceres.system.service.RoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 查询后台角色列表
     * @return
     */
    @Override
    public List<Role> findAll() {
        //查询所有角色
        List<Role> roleList = roleMapper.selectAll();
        List<Role> roles = new ArrayList<>();
        for (Role role : roleList) {
            //如果是0的话就是后台角色，将所有后台角色放入新的List里面去
            if ("0".equals(role.getCategory())){
                roles.add(role);
            }
        }
        //返回后台角色列表
        return roles;
    }

    /**
     * 查询前台角色列表
     * @return
     */
    @Override
    public List<Role> findUserRole() {
        //查询所有角色
        List<Role> roleList = roleMapper.selectAll();
        List<Role> roles = new ArrayList<>();
        for (Role role : roleList) {
            //如果是0的话就是后台角色，将所有后台角色放入新的List里面去
            if ("1".equals(role.getCategory())){
                roles.add(role);
            }
        }
        //返回后台角色列表
        return roles;
    }

    @Override
    public Role findById(Integer id) {
        return roleMapper.selectByPrimaryKey(id);
    }

    /**
     *
     * 添加角色
     * @param menuIds
     * @param role
     */
    @Override
    public void addRole(Integer[] menuIds, Role role) {
        if (roleExistChecking(role)){
            roleMapper.insert(role);
            addRoleAndMenu(role.getId(),menuIds);
        }else {
            throw new RuntimeException("改角色名已存在");
        }
    }

    /**
     * 删除没有用户关联的角色及其关联的菜单
     * @param roleId
     */
    @Override
    public void deleteRoleById(Integer roleId) {
        //根据传入的角色id查询角色用户中间表，是否有用户关联
        Integer[] adminByRole = roleMapper.findAdminByRole(roleId);
        if (adminByRole.length==0){//如果没有用户关联该角色
            //根据角色id删除角色和菜单的关联表
            roleMapper.deleteMenusByRoleId(roleId);
            //根据角色id删除该角色
            roleMapper.deleteByPrimaryKey(roleId);
        }else {
            throw new RuntimeException("该角色已关联用户，请先解除关联");
        }
    }

    /**
     * 将前台更新的角色信息更新到从数据库中查询出来的role中，并删除之前的关联表，根据传入的数组添加新的角色权限关联
     * @param role
     * @param menuIds
     */
    @Override
    public void updateRole(Role role, Integer[] menuIds) {
        //根据传入的角色id查询数据库中的角色信息
        Role role1 = roleMapper.selectByPrimaryKey(role.getId());
        //获取前台传入的角色信息更新
        String info = role.getInfo();
        //将修改的角色info更新到从数据库中查询出来的角色中
        role1.setInfo(info);
        //将跟新后的角色信息更新到数据库中
        roleMapper.updateByPrimaryKeySelective(role1);
        //获取角色id
        Integer roleId = role.getId();
        //根据角色id删除关联菜单
        roleMapper.deleteMenusByRoleId(roleId);
        //根据角色id和前台传进来的菜单id数组添加关联表
        this.addRoleAndMenu(role1.getId(),menuIds);
    }

    /**
     * 根据条件分页查询
     * @param queryCondition
     * @param page
     * @param size
     * @return
     */
    @Override
    public Page<Role> queryRole(Map<String, Object> queryCondition, int page, int size) {
        PageHelper.startPage(page,size);
        Example example = new Example(Role.class);
        Example.Criteria criteria = example.createCriteria();
        if (queryCondition!=null){
            //角色名
            if (queryCondition.get("role")!=null&&!"".equals(queryCondition.get("role"))){
                criteria.andLike("role","%"+queryCondition.get("role")+"%");
            }
            //角色说明
            if (queryCondition.get("info")!=null&&!"".equals(queryCondition.get("info"))){
                criteria.andLike("info","%"+queryCondition.get("info")+"%");
            }
            //是前台角色还是后台角色
            if (queryCondition.get("category")!=null&&!"".equals(queryCondition.get("category"))){
                criteria.andLike("category", (String) queryCondition.get("category"));
            }
        }
        return (Page<Role>) roleMapper.selectByExample(example);
    }


    /**
     * 查询角色是否已经存在
     * @param role
     * @return
     */
    public boolean roleExistChecking(Role role){
        Role role1 = roleMapper.roleExistChecking(role.getRole());
/*        if (role1==null){
            return true;
        }else {
            return false;
        }*/
        return role1==null?true:false;
    }

    /**
     * 添加角色和权限到管理表中
     * @param roleId
     * @param menuIds
     */
    public void addRoleAndMenu(Integer roleId,Integer[] menuIds) {
        if (menuIds != null && menuIds.length > 0) {
            for (Integer menuId : menuIds) {
                roleMapper.addRoleAndMenu(roleId, menuId);
            }
        }

    }
}
